﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Library
{

    // Biểu diễn 1 thông điệp
    public class ChatMessage
    {
        public CommandType CmdType { get; set; }
        public string SenderName { get; set; }
        public object MsgBody { get; set; }

        public ChatMessage()
        {

        }
        public ChatMessage(byte[] buffer)
        {
            var idx = 0;

            CmdType = (CommandType)BitConverter.ToInt32(buffer, idx);
            idx += 4;

            var nameSize = BitConverter.ToInt32(buffer, idx);
            idx += 4;

            SenderName = Encoding.UTF8.GetString(buffer, idx, nameSize);
            idx += nameSize;

            switch (CmdType)
            {
                case CommandType.SendListOnLine:
                    var SoNguoiChoi = BitConverter.ToInt32(buffer, idx);
                    idx += 4;
                    MsgBody = new List<ThongTinNguoiChoi>();
                    for (int i = 0; i < SoNguoiChoi; i++)
                    {
                        var usernamezise = BitConverter.ToInt32(buffer, idx);
                        idx += 4;
                        var tennguoichoi = Encoding.UTF8.GetString(buffer, idx, usernamezise);
                        idx += usernamezise;
                        var ban = BitConverter.ToInt32(buffer, idx);

                        idx += 4;

                        (MsgBody as List<ThongTinNguoiChoi>).Add(new ThongTinNguoiChoi(tennguoichoi, ban));
                    }
                    break;
                default:
                    var bodySize = BitConverter.ToInt32(buffer, idx);
                    idx += 4;
                    MsgBody = Encoding.UTF8.GetString(buffer, idx, bodySize);
                    break;
            }
        }

        // Hàm chuyển thông điệp thành mảng byte
        public byte[] ToByteArray()
        {
            var bytes = new List<byte>();

            // Chuyển loại thông điệp thành mảng 4 bytes
            var buffer = BitConverter.GetBytes((int)CmdType);
            bytes.AddRange(buffer);

            // Chuyển chiều dài tên thành mảng 4 bytes
            buffer = BitConverter.GetBytes(SenderName.Length);
            bytes.AddRange(buffer);

            // Chuyển tên thành mảng bytes
            buffer = Encoding.UTF8.GetBytes(SenderName);
            bytes.AddRange(buffer);

            switch (CmdType)
            {

                case CommandType.SendListOnLine:
                    var ListNguoiChoi = MsgBody as List<ThongTinNguoiChoi>;
                    bytes.AddRange(BitConverter.GetBytes(ListNguoiChoi.Count));
                    foreach (var item in ListNguoiChoi)
                    {
                        bytes.AddRange(BitConverter.GetBytes(item.UserName.Length));
                        bytes.AddRange(Encoding.UTF8.GetBytes(item.UserName));
                        bytes.AddRange(BitConverter.GetBytes(item.Ban));
                    }
                    break;
                default:
                    // Chuyển chiều dài nội dung thành mảng 4 bytes
                    buffer = BitConverter.GetBytes((MsgBody as string).Length);
                    bytes.AddRange(buffer);

                    // Chuyển nội dung thành mảng bytes
                    buffer = Encoding.UTF8.GetBytes(MsgBody.ToString());
                    bytes.AddRange(buffer);
                    break;
            }

            return bytes.ToArray();
        }
    }
}
